package edu.washington.escience.myria.operator.network.distribute;
import java.util.BitSet;
import javax.annotation.Nonnull;
import edu.washington.escience.myria.storage.TupleBatch;
/**
* A partition function that simply sends one tuple to each output in turn.
*/
public final class RoundRobinPartitionFunction extends PartitionFunction {
/** Required for Java serialization. */
private static final long serialVersionUID = 1L;
/** The current partition to use. */
private int curPartition = 0;
@Override
public TupleBatch[] partition(@Nonnull final TupleBatch tb) {
BitSet[] partitions = new BitSet[numPartitions()];
for (int i = 0; i < partitions.length; ++i) {
partitions[i] = new BitSet();
}
for (int i = 0; i < tb.numTuples(); i++) {
partitions[curPartition].set(i);
curPartition = (curPartition + 1) % numPartitions();
}
TupleBatch[] tbs = new TupleBatch[numPartitions()];
for (int i = 0; i < tbs.length; ++i) {
tbs[i] = tb.filter(partitions[i]);
}
return tbs;
}
}